/**
 * object_v2-type.h，来自于 saltfishexcapel/object_v2 项目
 *
 * 版权所有 2023 SaltFishExcapel/余涵，korack@163.com
 *
 * 此程序是自由软件：您可以根据自由软件基金会发布的GNU通用公共许可证的条款、
 * 许可证的第3版或（根据您的选择）任何更高版本对其进行重新分发和/或修改。
 * 分发此程序是希望它有用，但没有任何保证；甚至没有对适销性或特定用途适用性的
 * 隐含保证。有关更多详细信息，请参阅GNU通用公共许可证。您应该已经收到一份
 * GNU通用公共许可证的副本以及此程序。如果没有，请参阅
 * http://www.gnu.org/licenses/
 *
 * SPDX-License-Identifier: GPL-3.0-or-later
 */
#ifndef OBJECT_V2_H
#define OBJECT_V2_H

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

typedef void*         o_ptr;
typedef long          o_long;
typedef unsigned long o_ulong;
typedef long          o_type8;
typedef unsigned int  o_uint;
typedef void (*o_dest_func) (void*);

#define O_PTR(any)  ((o_ptr)(any))

/*声明一个对象*/
#define OBJECT_DECLARE(ObjName, obj_name)                                \
        typedef struct _##ObjName ObjName;                               \
        void                      obj_name##_init (ObjName* obj);        \
        void                      obj_name##_destruction (ObjName* obj); \
        ObjName*                  obj_name##_new ();                     \
        void                      obj_name##_destory (ObjName* obj);

#define OBJECT_NEW(ObjectType) ((ObjectType*)malloc (sizeof (ObjectType)))

/*在源文件中声明 new 和 destory*/
#define OBJECT_NEW_DEFINE(ObjName, obj_name) \
        ObjName* obj_name##_new ()           \
        {                                    \
                ObjName* obj;                \
                obj = OBJECT_NEW (ObjName);  \
                obj_name##_init (obj);       \
                return obj;                  \
        }

#define OBJECT_DESTORY_DEFINE(ObjName, obj_name) \
        void obj_name##_destory (ObjName* obj)   \
        {                                        \
                if (!obj)                        \
                        return;                  \
                obj_name##_destruction (obj);    \
                free (obj);                      \
                return;                          \
        }

#define OBJECT_DEFINE_START(ObjName, obj_name) \
        OBJECT_NEW_DEFINE (ObjName, obj_name)  \
        OBJECT_DESTORY_DEFINE (ObjName, obj_name)

OBJECT_DECLARE (Object, object)
#define OBJECT(any_obj) ((Object*)(any_obj))
struct _Object
{
        o_dest_func _dest_func;
        int         ref;
};

#define OBJECT_DEST_FUNC(any_func) ((o_dest_func)(any_func))

/*为 Object 对象设置销毁函数*/
void _object_set_destory_func (Object* obj, o_dest_func df);
/*增加 Object 节点的引用一次*/
void _object_addref (Object* obj);
/*减少 Object 节点的引用一次*/
void _object_unref (Object* obj);

/*为 Object 对象设置销毁函数*/
#define object_set_destory_func(obj, dest_func) \
        _object_set_destory_func (OBJECT (obj), OBJECT_DEST_FUNC (dest_func))
/*增加 Object 节点的引用一次*/
#define object_addref(any)    _object_addref (OBJECT (any))
/*减少 Object 节点的引用一次*/
#define object_unref(any)     _object_unref (OBJECT (any))

#endif